/**
 * 
 */
package cr.co.tse.padronelectoral;

import java.util.Map;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

import cr.co.tse.padronelectoral.domain.CodigoElectoralInscrito;
import cr.co.tse.padronelectoral.domain.Junta;
import cr.co.tse.padronelectoral.parser.RowProcessorHandler;

/**
 * Implementation to Patron Electoral csv row processor.
 * 
 * @author jsanca
 * 
 */
public class PatronElectoralRowProcessorHandler implements RowProcessorHandler {

	private Map<Integer, CodigoElectoralInscrito> mapDistelect = null;
	private IndexWriter indexWriter = null;
	private Map<String, Junta> juntaMap = null;

	public PatronElectoralRowProcessorHandler(
			Map<Integer, CodigoElectoralInscrito> mapDistelect,
			Map<String, Junta> juntaMap, IndexWriter indexWriter) {

		this.mapDistelect = mapDistelect;
		this.indexWriter = indexWriter;
		this.juntaMap = juntaMap;
	} // PatronElectoralRowProcessorHandler.

	/*
	 * (non-Javadoc)
	 * 
	 * @see cr.co.tse.padronelectroral.parser.RowProcessorHandler#process(java.lang.String[])
	 */
	@Override
	public void process(String[] row) {

		Document document = new Document();
		String juntareceptora = row[4].trim();
		Integer key = new Integer(juntareceptora);
		Junta junta = this.juntaMap.get(key.toString());
		boolean juntaNull = false;
		if (null == junta) {
		  juntaNull = true;
		  junta = findJunteIfisNull (junta, key);
		}
		
		document.add(new Field("cedula", row[0].trim(), Field.Store.YES,
				Field.Index.ANALYZED));
		document.add(new Field("canton", this.mapDistelect.get(
				Integer.parseInt(row[1])).getCanton().trim(), Field.Store.YES,
				Field.Index.NO));
		document.add(new Field("provincia", this.mapDistelect.get(
				Integer.parseInt(row[1])).getProvincia().trim(),
				Field.Store.YES, Field.Index.NO));
		document.add(new Field("lugarelectoralinscrito", this.mapDistelect.get(
				Integer.parseInt(row[1])).getLugarElectroralInscrito().trim(),
				Field.Store.YES, Field.Index.NO));
		document.add(new Field("sexo", row[2].trim(), Field.Store.YES,
				Field.Index.NO));
		document.add(new Field("fechavencimiento", row[3].trim(),
				Field.Store.YES, Field.Index.NO));
		document.add(new Field("juntareceptora", juntareceptora,
				Field.Store.YES, Field.Index.NO));
		if (null != junta) {
		
			String prefix = (juntaNull)?"[+ PROX]":"";
			document.add(new Field("juntadireccion", junta.getDireccion(), Field.Store.YES,
					Field.Index.NO));
			document.add(new Field("juntanombre", prefix+junta.getNombreJunta(),
					Field.Store.YES, Field.Index.NO));
		} else {
			
			System.out.println("La junta: " + juntareceptora + ", no tiene junta asociada!");
		}
		document.add(new Field("nombre", row[5].trim(), Field.Store.YES,
				Field.Index.ANALYZED));
		document.add(new Field("apellido1", row[6].trim(), Field.Store.YES,
				Field.Index.ANALYZED));
		document.add(new Field("apellido2", row[7].trim(), Field.Store.YES,
				Field.Index.ANALYZED));
		try {
			this.indexWriter.addDocument(document);
		} catch (Exception e) {
			e.printStackTrace();
		}
	} // process.

	private Junta findJunteIfisNull(Junta junta, Integer key) {

		junta = this.juntaMap.get(key);
		if (null == junta) {
			junta = this.findJunteIfisNull(junta, key-1);
		}
		return junta;
	}

} // E:O:F:PatronElectoralRowProcessorHandler.
